/**
 * @class Gestione dei commenti delle foto
 * @param divId
 * @param username
 * @param owner
 * @param id
 * @param controller
 * @param readAction
 * @param writeAction
 * @param modifyAction
 * @param deleteAction
 * @param admin
 * @returns
 */

function CommentiFoto(divId,username,owner,id,controller,readAction,writeAction,modifyAction,deleteAction,admin) {
	/**
	 * Loader
	 * @field
	 */
	var loader = $('<img src="images/ajax-loader.gif" alt="loader ajax" style="display:block;margin:0 auto;" />');
	/**
	 * Puntatore interno
	 * @field
	 */
	var that = this;
	/**
	 * Commenti
	 * @field 
	 */
	var commenti = undefined;
	/**
	 * Username dell'utente attualmente loggato
	 * @field 
	 */
	var username = username;
	/**
	 * Username del proprietario della bacheca
	 * @field 
	 */
	var owner = owner;
	/**
	 * Admin flag
	 * @field admin
	 */
	var admin = admin;
	/**
	 * Id della foto
	 * @field id
	 */
	var id = id;
	/**
	 * Nome del controller
	 * @field
	 */
	var controller = controller;
	/**
	 * Nome dell'azione di lettura
	 * @field
	 */
	var readAction = readAction;
	/**
	 * Nome dell'azione di modifica
	 * @field 
	 */
	var modifyAction = modifyAction;
	/**
	 * Nome dell'azione di cancellazione
	 * @field 
	 */
	var deleteAction = deleteAction;
	/**
	 * Nome dell'azione di scrittura
	 * @field 
	 */
	var writeAction = writeAction;
	/**
	 * Oggetto jquery della bacheca
	 * @field
	 */
	var bacheca = $('#' + divId +' .messaggi');
	/**
	 * Oggetto jquery della textarea del commento
	 * @field bachecaCommento
	 */
	var bachecaCommento = $('#' + divId + ' .commento textarea');
	/**
	 * Flag 
	 * @field 
	 */
	var firstInitCommento = 0;
	/**
	 * Impedisco di modificare, altri commenti se ne sto modificando uno.
	 * 
	 * @field 
	 */
	var modifying = 0; 
	/**
	 * Id del commento che sto modificando
	 */
	
	var modifiedComm = undefined;
	/**
	 * Riceve un array di oggetti commento, e crea la bacheca
	 * aggiunge pulsanti ed altro
	 */
	this.creaBacheca =  function(){
		
		/** Reset di tutti i lock **/
		modifying = 0;
		
		if(window.console && window.debug){
			window.console.info('Bacheca loaded!');
		}
		
		bacheca.html('');
		
		//Vedo se e' vuoto
		var empty = true;
		
		for(var i in commenti){
			empty = false;
		}
		
		if(commenti == undefined || empty){
			bacheca.append('<p>Nessun commento presente!</p>');
			return;
		}
		
		var num = commenti.length;
		var comm = commenti;
		
		if(num != 0){
			
			for(var i = 0; i < num; i++) {
				
				var div = $('<div class="comm commento-'+i+'"></div>');
				var controls = $('<div class="controls"></div>');
				var link_utente = $('<a href="javascript:ajax.doAjax(\'index.php?c=CUtente&a=mostraProfilo&username='+comm[i].writer+'\')"></a>').text(comm[i].writer + ':');
				var autore = $('<span class="autore"></span>').append(link_utente);
				var text = $('<span class="text"></span>').text(comm[i].commento)
				var p = $('<div class="nm"></div>');
				
				p.append(autore);
				p.append(text);
				
				if(username == comm[i].writer || admin == 1){
					

					
					var comandi = $('<a href="#" ></a> ').button({
						icons:{
							primary: "ui-icon-pencil"
						}
					}).bind('click',
							{num:i},
							function(event){
								that.modificaCommento(event.data.num);
								return false;
					});
					
					controls.append(comandi);
				}
				
				if(owner == username || username == comm[i].writer || admin == 1){
					
					var comandi = $('<a href="#" ></a> ').bind(
							'click',
							{num:i},
							function(event){
								that.rimuoviCommento(event.data.num);
								return false;
						}
					
					).button({
						icons:{
							primary:"ui-icon-trash"
						}
					});
					
					
					controls.append(comandi);
				}
				
				div.append(controls);
				div.append(p);
				
				bacheca.append(div);
			}	
		}	
	}
	/**
	 * Fa una richiesta ajax e carica gli oggetti della bacheca
	 */
	this.loadBacheca = function () {
		
		if(window.console && window.debug){
			window.console.info('Bacheca loading ...');
		}
		
		bacheca.empty();
		bacheca.append(loader);
		
		//post data
		var data = {
				c : controller,
				a : readAction,
				u : 'on',
				id : id
		} 
		
		$.ajax({
			type:'POST',
			url:'index.php',
			data: data,
			success:that.lbSuccess,
			error:that.mostraErrore
		});
	}
	
	/**
	 * Gestisce la risposta ajax proveniente da loadBacheca
	 * @param jsonArray
	 */
	this.lbSuccess = function(jsonArray){
		
		if(window.console && window.debug){
			window.console.info('load success ...');
		}
		try {
			commenti = $.parseJSON(jsonArray);
		}catch(e){
			window.messaggioPopup.display('Errore','Errore nella ricezione dei commenti!');
		}
		that.creaBacheca();
		
	}

	/**
	 * Fa una richiesta ajax e posta il commento
	 * @param comment
	 */
	
	this.postaCommento = function(comment) {
		
		if(window.console && window.debug){
			window.console.info('Inviando il commento ...');
		}
		
		bachecaCommento.attr('disabled',1);
		
		/**
		 * Post data
		 */
		
		var data = {
				c: controller,
				a: writeAction,
				u : 'on',
				id : id,
				commento: comment
		}
		
		/**
		 * Ajax request
		 */
		
		$.ajax({
			type:'POST',
			url:'index.php',
			data:data,
			success:that.commentoPostatoHandler,
			error:that.mostraErrore
		});
		
	}
	
	/**
	 * Gestisce la risposta dopo aver provato a postare il commento
	 * @param html
	 * @param response
	 */
	
	this.commentoPostatoHandler = function(html,response){
		
		var tempNode = $(html);
		
		if(tempNode.attr('id') == 'messaggio_ok'){
			//window.messaggioPopup.display('Commento Postato!', 'Il tuo commento &egrave; stato postato correttamente!');
			bachecaCommento.attr('value','');
		}else{
			window.messaggioPopup.display('Commento non postato!', 'Il tuo commento non &egrave; stato postato! Errore:'+html);
		}
		
		if(window.console && window.debug){
			window.console.info('Commento postato!');
		}
		
		that.loadBacheca();
		
		bachecaCommento.removeAttr('disabled');
	}
	
	/**
	 * Mostra errore
	 */
	this.mostraErrore = function(){
		
		if(window.console && window.debug){
			window.console.info('Si e\' verificato un errore!');
		}
		
		window.messaggioPopup.display('Si e\' verificato un errore!','Impossibile contattare il server');
		
		
	}
	
	/**
	 * Gestisce la risposta dopo aver provato a rimuovere il commento
	 * @param html
	 * @param response
	 */
	this.commentoRimossoHandler = function(html,response){
		
		var tempNode = $(html);
		
		if(tempNode.attr('id') == 'messaggio_ok'){
			//window.messaggioPopup.display('Commento rimosso!','Il commento &egrave; stato rimosso correttamente!');
		}else{
			window.messaggioPopup.display('Commento non rimosso!','Si &egrave verificato un&#039;errore');
		}
		
		that.loadBacheca();
	}
	
	/**
	 * Rimuove il commento
	 * @param num
	 */
	this.rimuoviCommento = function(num){
		
		if(window.console && window.debug){
			window.console.info('Rimozione commento ... ');
		}
		
		var objToRem = commenti[num];
		
		var data = {
				c: controller,
				a: deleteAction,
				u : 'on',
				commento:$.toJSON(objToRem)
		};
		
		$.ajax({
			type:'POST',
			url:'index.php',
			data:data,
			success:that.commentoRimossoHandler,
			error:that.mostraErrore
		});
		
		
		
	}
	
	/**
	 * Modifica il commento
	 * @param num
	 */
	this.modificaCommento = function(num){
		
		//Semaforo
		if(modifying == 0){
			modifying++;
		}else{
			window.messaggioPopup.display('Errore', 'Puoi modificare un messaggio alla volta!');
			return;
		}
		
		modifiedComm = num;
		
		var div = $('.commento-'+num);
		var text = $('.commento-'+num+' .text');
		
		var value = text.html();
		text.remove();
		
		div.append('<textarea rows="10" cols="5" style="width:100%">'+value+'</textarea>'
				).keypress(that.updateCommento);
		
		
		
	}
	/**
	 * Aggiorna il commento
	 * @param e
	 */
	this.updateCommento = function(e){
		if(e.which == 13){
			
			var obj = commenti[modifiedComm];
			obj.commento = $('.commento-'+modifiedComm+' textarea').attr('value');
			
		}else{
			return;
		}
		
		modifiedComm = undefined;
		
		var data = {
				c: controller,
				a: modifyAction,
				u: 'on',
				commento:$.toJSON(obj)
		};
		
		$.ajax({
			url:'index.php',
			type:'POST',
			data:data,
			success:that.modificaUpdateHandler,
			error:that.mostraErrore
		});
		
	}
	
	/**
	 * Gestisce la risposta dopo aver provato a modificare il commento
	 * @param html
	 * @param response
	 */
	this.modificaUpdateHandler = function(html,response){
		
		modifying--;
		
		var id = $(html).attr('id');
		
		if(id == 'messaggio_ok'){
			//window.messaggioPopup.display('Commento modificato!', 'Il commento &egrave; stato correttamente modificato');
		}
		
		if(id == 'messaggio_errore'){
			window.messaggioPopup.display('Impossibile modificare il commento!','Non &egrave stato possibile modificare il commento');
		}
		
		that.loadBacheca();
		
	}
	
	/**
	 * Costruttore
	 */
	
	bachecaCommento.bind({
		'keypress':function(e){
			
			if(e.which == 13){
				var commento = bachecaCommento.attr('value');
				that.postaCommento(commento);
				
			}
		},'focus': function(e){
			if(firstInitCommento == 0){
				bachecaCommento.attr('value','');
				firstInitCommento = 1;
			}
		}
				
	});
	
	this.loadBacheca();
}


